home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
090
/
ciarnv85.arc
/
FSCRENZ.4TH
< prev
next >
Wrap
Text File
|
1986-04-08
|
5KB
|
113 lines
( FSCRENZ.4TH This file is canned in FORTH. )
( FILE MANAGEMENT USING DOS FUNCTION CALLS )
( This program contains routines to do basic file manipulations: )
( read, write, get a char, put a char, open and close files. )
( It also contains routines to implement the FORTH word ==> which )
( loads the FORTH source file whose name is specified after the )
( ==> and compiles or executes. E. G. ==> b:xeterm.4th would cause )
( the file xeterm.4th on the b drive to be loaded. )
( The following assembler definitions add 2 words, INT21 and INT3. )
( They simply do interrupt 21 hex and interrupt 3 respectively. )
( Interrupt 21h is a DOS function call. It's number is passed in AH. )
ASSEMBLER DEFINITIONS HEX CD 21 10MI INT21
HEX CC 1MI INT3 FORTH DEFINITIONS
( The following word allows you to type DEBUG and enter the debugger )
( if you entered FORTH under DEBUG.COM )
CODE DEBUG INT3 NEXT JMP END-CODE
HEX
1A CONSTANT EOF
VARIABLE IOBUFF
VARIABLE IOERR ( The error codes are stored in this variable. )
( The routine DCALL is used to intiate DOS function calls in FORTH. )
( It leaves any error code returned or 0 and a flag indicating whether )
( the call was a success. )
CODE DCALL
AX POP
CX POP
DX POP
BX POP
INT21
AX PUSH
AX, # 0 MOV
HERE 3 + JB
AX INC
AX PUSH
NEXT JMP END-CODE
( fh means file handle. fname means a pointer to the file name. )
( pmode
: FREAD ( fh,bufadr,#bytes -- #bytes )
3F00 DCALL IF 0 ELSE 0 SWAP THEN IOERR ! ;
: FCREAT ( FNAME, PMODE -- FH )
( RETURNS A ZERO IF IT FAILS, IOERR HAS ERR # )
0 ROT ROT 3C00 DCALL
IF 0 ELSE 0 SWAP THEN IOERR ! ;
: FOPEN ( fname, rwmode -- fh )
SWAP OVER DUP 3D00 + DCALL
IF 0 ELSE 0 SWAP THEN IOERR ! ;
: FCLOSE ( fh -- )
0 0 3E00 DCALL IF DROP 0 THEN IOERR ! ;
: FWRITE ( fh, bufadr, #bytes -- #bytes )
4000 DCALL IF 0 ELSE 0 SWAP THEN IOERR ! ;
: FGETC ( fh -- char or EOF )
IOBUFF 1 FREAD IF IOBUFF C@ ELSE EOF THEN ;
: FPUTC (fh, char -- )
IOBUFF C! IOBUFF 1 FWRITE DROP ;
VARIABLE FNAME 20 ALLOT
: FNAME? CR ." PLEASE ENTER NAME " FNAME 10 EXPECT ;
: ZWORD BL WORD DUP DUP C@ + OVER DUP 1+ SWAP DUP C@ CMOVE
0 SWAP C! ;
: FTYPE ZWORD 0 FOPEN DUP IF
PAGE BEGIN DUP FGETC DUP EMIT EOF = UNTIL ELSE
." FILE CANNOT BE OPENED " CR THEN ;
HEX ( ROUTINES TO IMPLIMENT ==> FILE LOAD OPERATION )
VARIABLE ==>FN 40 ALLOT ( CURRENT FILE NAME )
VARIABLE ==>FH 0 ==>FH ! ( OPEN FILE HANDLE OR 0 )
VARIABLE ==>FB 110 ALLOT ( FILE INPUT BUFFER )
VARIABLE ==>L# ( LINE NUMBER IN CURRENT FILE )
: ==>EXP ( VECTOR EXPECT TO HERE )
==>FH @ IF OVER + SWAP DO
==>FH @ FGETC DUP EOF = IF
DROP ==>FH @ FCLOSE 0 ==>FH ! ." OK" QUIT THEN
DUP 0D = IF DROP BL THEN
DUP 0A = IF
LEAVE 1 ==>L# +! DROP BL THEN
I C! 0 I 1+ !
1 /LOOP ELSE
<EXPECT> THEN ;
: QLFBRK ( PATCHES INTO QUIT'S LEFT BRACKET )
==>FH @ IF ==>FH @ FCLOSE 0 ==>FH ! THEN [COMPILE] [ ;
: ?IOERR IOERR @ IF CR ." IOERR #" . CR ABORT THEN ;
: ZTYPE BEGIN DUP C@ ?DUP WHILE EMIT 1+ REPEAT DROP ;
: WHERE@ ( TO PATCH WHERE )
@ DUP IF ELSE ==>FH @ IF
CR ." LOADING FILE " ==>FN ZTYPE ." LINE #" ==>L# ?
CR CR TIB @ ZTYPE THEN THEN ;
: ==>INIT ' QLFBRK CFA 1E29 !
' WHERE@ CFA 2307 !
' ==>EXP CFA 'EXPECT !
100 1E0E ! ( QUERY'S LENGTH )
==>FB 100 0 FILL
==>FB TIB ! ;
: ==> ZWORD TIB @ ==>FB - IF ==>INIT THEN
==>FN 30 CMOVE ==>FN 0 FOPEN DUP IF
==>FH ! 0 ==>L# ! BEGIN
RP! QUERY INTERPRET AGAIN ELSE
." CANNOT OPEN FILE " ABORT THEN ;